<!DOCTYPE html>
<html lang="en-US">
    <head>
        <title>File::ReadBackwards - Read a file backwards by lines. - metacpan.org</title>
        <link rel="preload" as="fetch" href="https://metacpan.org/account/login_status" crossorigin="anonymous" />
        <link href="https://metacpan.org/_assets/b8ccceeed47a0652049703d99326a9cea4933443.css" rel="stylesheet" type="text/css">
        <script src="https://metacpan.org/_assets/6bfedafe2d7caa915b7d84f61b45936818e3242e.js" type="text/javascript" defer></script>
        <link rel="alternate" type="application/rss+xml" title="Recent CPAN Uploads of File-ReadBackwards - MetaCPAN" href="https://metacpan.org/dist/File-ReadBackwards/releases.rss" />
        <link rel="canonical" href="./File::ReadBackwards.html" />
        <meta name="description" content="Read a file backwards by lines." />
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5">
        <link rel="shortcut icon" href="https://metacpan.org/static/icons/favicon.ico">
        <link rel="apple-touch-icon" sizes="152x152" href="https://metacpan.org/static/icons/apple-touch-icon.png">
        <link rel="search" href="https://metacpan.org/static/opensearch.xml" type="application/opensearchdescription+xml" title="MetaCPAN">
        <script>
          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

          (function(skey, ga_id){
            ga('create', ga_id, {
              siteSpeedSampleRate : 100,
              storage             : 'none',
              clientId            : localStorage.getItem(skey)
            });
            ga(function(tracker) {
              localStorage.setItem(skey, tracker.get('clientId'));
            });
            ga('send', 'pageview');
          })('ga:clientId', 'UA-27829474-1');
        </script>
<meta name="twitter:card"        content="summary" />
<meta name="twitter:url"         content="https://metacpan.org/pod/File::ReadBackwards" />
<meta name="twitter:title"       content="File::ReadBackwards" />
<meta name="twitter:description" content="Read a file backwards by lines." />
<meta name="twitter:site"        content="metacpan" />
    </head>
    <body>
        <nav class="navbar navbar-default" role="navigation">
            <div class="header-logo-large hidden-xs">
              <a href="https://metacpan.org/" tabindex="0">
                <svg class="logo" aria-label="MetaCPAN">
                  <use class="logo" href="/static/images/metacpan-logo.svg#logo" />
                </svg>
              </a>
            </div>
            <div class="header-logo-icon visible-xs">
              <a href="https://metacpan.org/">
                <svg class="logo" aria-label="MetaCPAN">
                  <use class="logo" href="/static/images/metacpan-logo.svg#dots" />
                </svg>
              </a>
            </div>
            <ul class="nav navbar-nav menu-items hidden-xs hidden-sm">
              <li><a href="https://metacpan.org/about">About</a></li>
              <li><a href="https://metacpan.org/about/sponsors">Sponsor</a></li>
              <li><a href="https://grep.metacpan.org/">grep::cpan</a></li>
              <li><a href="https://metacpan.org/recent">Recent</a></li>
              <li><a href="https://metacpan.org/about/faq">FAQ</a></li>
              <li><a href="https://metacpan.org/tools">Tools</a></li>
              <li><a href="https://fastapi.metacpan.org/">API</a></li>
            </ul>
            <ul class="nav navbar-nav navbar-right">
                <button type="button" class="searchbar-btn visible-xs visible-sm">
                    <i class="fa fa-search button-fa-icon"></i>
                </button>
                <form action="https://metacpan.org/search" class="searchbar-form visible-md visible-lg search-form form-horizontal">
                   <input type="hidden" name="size" id="metacpan_search-size" value="20">
                  <div class="form-group">
                      <div class="search-group">
                        <i class="fa fa-search"></i>
                        <input type="text" name="q" placeholder="Search the CPAN" size="41" autocorrect="off" autocapitalize="off" spellcheck="false" id="metacpan_search-input" class="form-control" value="">
                      </div>
                  </div>
                </form>
                    <li class="icon-slidepanel visible-xs visible-sm">
                      <button data-toggle="slidepanel" data-target=".slidepanel">
                        <span class="button-fa-icon">
                          <i class="fa fa-bars slidepanel-open"></i>
                          <i class="fa fa-times slidepanel-close"></i>
                        </span>
                      </button>
                    </li>
                <form action="https://metacpan.org/account/logout" method="POST" id="metacpan-logout"></form>
                <li class="dropdown logged_in" style="display: none;">
                    <button type="button" class="dropdown-toggle" data-toggle="dropdown">
                      <i class="fa fa-user button-fa-icon logged-in-icon" aria-hidden="true"></i>
                      <i class="fas fa-chevron-down"></i>
                    </button>
                    <ul class="dropdown-menu">
                        <li><a href="https://metacpan.org/account/identities">Identities</a></li>
                        <li><a href="https://metacpan.org/account/profile">Profile</a></li>
                        <li><a href="https://metacpan.org/account/favorite/list">Favorites</a></li>
                        <li>
                            <a href="./File::ReadBackwards.html#" type="button" onclick="$('#metacpan-logout').submit(); return false">
                              Logout
                            </a>
                        </li>
                    </ul>
                </li>
                <li class="dropdown logged_out" style="display: none;">
                    <button type="button" class="dropdown-toggle" data-toggle="dropdown">
                      <i class="fa fa-user button-fa-icon" aria-hidden="true"></i>
                      <i class="fas fa-chevron-down"></i>
                    </button>
                    <ul class="dropdown-menu">
                        <li>
                            <a href="https://metacpan.org/login/github">
                                <i class="fab fa-github fa-fw"></i>
                                GitHub
                            </a>
                        </li>
                        <li>
                            <a href="https://metacpan.org/login/twitter">
                                <i class="fab fa-twitter fa-fw"></i>
                                Twitter
                            </a>
                        </li>
                        <li>
                            <a href="https://metacpan.org/login/google">
                                <i class="fab fa-google fa-fw"></i>
                                Google
                            </a>
                        </li>
                    </ul>
                </li>
                <li class="dropdown logged_placeholder">
                    <button>
                      <i class="fa fa-user button-fa-icon" aria-hidden="true"></i>
                    </button>
                </li>
            </ul>
        </nav>
        <div class="page-content ">
          <!--
          <div class="top-notify-banner">
            <i class="fas fa-info-circle"></i>
          </div>
          -->
          <nav class="sidebar">
            <div class="slidepanel">
              <ul class="nav-list ">
    <li class="nav-header no-margin-top">
      <div class="ttip" data-toggle="tooltip" data-placement="bottom" title="The date that this version of File-ReadBackwards was released.">
      <span class="relatize">23 Apr 2021 03:04:03 UTC</span>
    </li>
  <li>
    Distribution: <a href="https://metacpan.org/dist/File-ReadBackwards">File-ReadBackwards</a>
  </li>
  <li>
    Module version: 1.06
  </li>
  <li>
    <a data-keyboard-shortcut="g s" href="https://metacpan.org/dist/File-ReadBackwards/source/ReadBackwards.pm">Source</a>
    (<a href="https://metacpan.org/dist/File-ReadBackwards/source/ReadBackwards.pm?raw=1">raw</a>)
  </li>
  <li>
    <a data-keyboard-shortcut="g b" href="https://metacpan.org/dist/File-ReadBackwards/source">Browse</a>
    (<a href="https://metacpan.org/dist/File-ReadBackwards/source?raw=1">raw</a>)
  </li>
    <li>
      <a data-keyboard-shortcut="g c" href="https://metacpan.org/dist/File-ReadBackwards/changes">Changes</a>
    </li>
    <li>
      <a rel="noopener nofollow" class="nopopup" href="./File::ReadBackwards.html">Homepage</a>
    </li>
    <li>
      <a class="nopopup" href="https://metacpan.org/dist/File-ReadBackwards/contribute">How to Contribute</a>
    </li>
    <li>
        <a rel="noopener nofollow" data-keyboard-shortcut="g r" href="https://github.com/uperl/File-ReadBackwards">Repository</a>
    </li>
    <li>
      <a rel="noopener nofollow" data-keyboard-shortcut="g i" href="https://github.com/uperl/File-ReadBackwards/issues">Issues</a>
    </li>
    <li>
      <a rel="noopener nofollow" href="http://matrix.cpantesters.org/?dist=File-ReadBackwards+1.06" title="Matrix">Testers</a>
        <span title="(pass / fail / na)">(<a rel="noopener nofollow" href="https://www.cpantesters.org/distro/F/File-ReadBackwards.html?oncpan=1&amp;distmat=1&amp;version=1.06&amp;grade=2" style="color: #090">2979</a> / <a rel="noopener nofollow" href="https://www.cpantesters.org/distro/F/File-ReadBackwards.html?oncpan=1&amp;distmat=1&amp;version=1.06&amp;grade=3" style="color: #900">0</a> / <a rel="noopener nofollow" href="https://www.cpantesters.org/distro/F/File-ReadBackwards.html?oncpan=1&amp;distmat=1&amp;version=1.06&amp;grade=4">0</a>)</span>
    </li>
    <li>
      <a rel="noopener nofollow" href="http://cpants.cpanauthors.org/release/PLICEASE/File-ReadBackwards-1.06">Kwalitee</a>
    </li>
    <li>
      <div class="ttip" data-toggle="tooltip" data-placement="bottom" title="The # people with an indexing permission on File-ReadBackwards who have released something to CPAN in the last 2 years (i.e. the # people likely able to release critical fixes in a timely manner)">
      Bus factor: 1
      </div>
    </li>
    <li>
      <a rel="noopener nofollow" href="http://cpancover.com/latest/File-ReadBackwards-1.06/index.html">91.11% Coverage </a>
    </li>
    <li>
      License: unknown
    </li>
    <li class="nav-header">Activity</li>
    <li>
<div class="activity-graph">
    <img src="https://metacpan.org/dist/File-ReadBackwards/activity.svg?res=month" />
    <div class="comment">24 month</div>
</div>
    </li>
    <li class="nav-header">Tools</li>
    <li>
      <a itemprop="downloadUrl" href="https://cpan.metacpan.org/authors/id/P/PL/PLICEASE/File-ReadBackwards-1.06.tar.gz">
      Download (<span itemprop="fileSize">9.51KB</span>)</a>
    </li>
    <li>
      <a href="https://explorer.metacpan.org/?url=%2Fmodule%2FPLICEASE%2FFile-ReadBackwards-1.06%2FReadBackwards.pm">
        MetaCPAN Explorer
      </a>
    </li>
    <li>
      <a href="https://metacpan.org/dist/File-ReadBackwards/permissions">
        Permissions
      </a>
    </li>
    <li>
      <a href="https://metacpan.org/dist/File-ReadBackwards/releases.rss">
        Subscribe to distribution
      </a>
    </li>
    <li>
      <button class="btn btn-link" data-toggle="modal" data-target="#metacpan_install-instructions-dialog">
        Install Instructions
      </button>
    </li>
    <li>
      <form action="https://metacpan.org/search">
        <input type="hidden" name="q" value="dist:File-ReadBackwards">
        <input type="search" name="q" placeholder="Search distribution" class="form-control tool-bar-form">
        <input type="submit" style="display: none">
      </form>
    </li>
    <li>
      <form action="https://grep.metacpan.org/search">
        <input type="hidden" name="qd" value="File-ReadBackwards">
        <input type="hidden" name="source" value="metacpan">
        <input type="search" name="q" placeholder="grep distribution" class="form-control tool-bar-form">
        <input type="submit" style="display: none">
     </form>
    </li>
    <li class="version-jump">
<select onchange="document.location.href=&#39;/release/&#39;+this.value+&#39;/view/ReadBackwards.pm&#39;" class="form-control tool-bar-form">
  <option disabled selected>Jump to version</option>
<option
  disabled
  value="PLICEASE/File-ReadBackwards-1.06"
>1.06
  (PLICEASE on 2021-04-23)</option>
<option
  
  value="URI/File-ReadBackwards-1.05"
>1.05
  (URI on 2011-06-07)</option>
<option
  
  value="URI/File-ReadBackwards-1.04"
>1.04
  (URI on 2005-05-14)</option>
<optgroup label="BackPAN">'
<option
  
  value="URI/File-ReadBackwards-1.03"
>1.03
  (URI on 2005-01-30)</option>
<option
  
  value="URI/File-ReadBackwards-1.02"
>1.02
  (URI on 2003-11-24)</option>
<option
  
  value="URI/File-ReadBackwards-1.00"
>1.00
  (URI on 2003-08-18)</option>
<option
  
  value="URI/File-ReadBackwards-0.99"
>0.99
  (URI on 2002-12-03)</option>
<option
  
  value="URI/File-ReadBackwards-0.98"
>0.98
  (URI on 2002-08-22)</option>
<option
  
  value="URI/File-ReadBackwards-0.97"
>0.97
  (URI on 2002-05-27)</option>
<option
  
  value="URI/File-ReadBackwards-0.96"
>0.96
  (URI on 2002-05-26)</option>
<option
  
  value="URI/File-ReadBackwards-0.95"
>0.95
  (URI on 2002-05-06)</option>
<option
  
  value="URI/File-ReadBackwards-0.94"
>0.94
  (URI on 2000-03-08)</option>
<option
  
  value="URI/File-ReadBackwards-0.92"
>0.92
  (URI on 2000-03-06)</option>
<option
  
  value="URI/File-ReadBackwards-0.90"
>0.90
  (URI on 2000-02-29)</option>
</optgroup>
</select>
    </li>
    <li class="version-diff">
<select onchange="document.location.href='/release/PLICEASE/File-ReadBackwards-1.06/diff/' + encodeURIComponent(this.value) + '/ReadBackwards.pm'
" class="form-control tool-bar-form">
  <option disabled selected>Diff with version</option>
<option
  disabled
  value="PLICEASE/File-ReadBackwards-1.06"
>1.06
  (PLICEASE on 2021-04-23)</option>
<option
  
  value="URI/File-ReadBackwards-1.05"
>1.05
  (URI on 2011-06-07)</option>
<option
  
  value="URI/File-ReadBackwards-1.04"
>1.04
  (URI on 2005-05-14)</option>
<optgroup label="BackPAN">'
<option
  
  value="URI/File-ReadBackwards-1.03"
>1.03
  (URI on 2005-01-30)</option>
<option
  
  value="URI/File-ReadBackwards-1.02"
>1.02
  (URI on 2003-11-24)</option>
<option
  
  value="URI/File-ReadBackwards-1.00"
>1.00
  (URI on 2003-08-18)</option>
<option
  
  value="URI/File-ReadBackwards-0.99"
>0.99
  (URI on 2002-12-03)</option>
<option
  
  value="URI/File-ReadBackwards-0.98"
>0.98
  (URI on 2002-08-22)</option>
<option
  
  value="URI/File-ReadBackwards-0.97"
>0.97
  (URI on 2002-05-27)</option>
<option
  
  value="URI/File-ReadBackwards-0.96"
>0.96
  (URI on 2002-05-26)</option>
<option
  
  value="URI/File-ReadBackwards-0.95"
>0.95
  (URI on 2002-05-06)</option>
<option
  
  value="URI/File-ReadBackwards-0.94"
>0.94
  (URI on 2000-03-08)</option>
<option
  
  value="URI/File-ReadBackwards-0.92"
>0.92
  (URI on 2000-03-06)</option>
<option
  
  value="URI/File-ReadBackwards-0.90"
>0.90
  (URI on 2000-02-29)</option>
</optgroup>
</select>
    </li>

    <li>
<ul class="dependencies">
  <li class="nav-header">Dependencies</li>
  <li><i class="ttip" title="dynamic_config enabled">unknown</i></li>
  <li>
    <hr>
  </li>
  <li>
    <a href="https://metacpan.org/module/File::ReadBackwards/requires">Reverse dependencies</a>
  </li>
  <li>
    <a href="http://deps.cpantesters.org/?module=File%3A%3AReadBackwards">CPAN Testers List</a>
  </li>
  <li>
    <a href="https://cpandeps.grinnz.com/?dist=File-ReadBackwards">Dependency graph</a>
  </li>
</ul>
    </li>
    <li class="nav-header">Permalinks</li>
    <li>
      <a href="https://metacpan.org/release/PLICEASE/File-ReadBackwards-1.06/view/ReadBackwards.pm">This version</a>
    </li>
    <li>
      <a href="./File::ReadBackwards.html">Latest version</a>
    </li>
    <li>
<div class="plussers">
<div class="nav-header">++ed by:</div>
<div>
<a class="display-all" href="https://metacpan.org/author/KABLAMO"><img src="https://www.gravatar.com/avatar/6c59a99ff976dc69fe31f1fe3bf6dc01?d=identicon&amp;s=20" title="KABLAMO" alt="KABLAMO"></a>
<a class="display-all" href="https://metacpan.org/author/BINJOY"><img src="https://www.gravatar.com/avatar/fd4de3b71caea7fa4b305ad108e999e0?d=identicon&amp;s=20" title="BINJOY" alt="BINJOY"></a>
<a class="display-all" href="https://metacpan.org/author/SREZIC"><img src="https://www.gravatar.com/avatar/5fa5a4e5ffdf883a1fcb1840c915d485?d=identicon&amp;s=20" title="SREZIC" alt="SREZIC"></a>
<a class="display-all" href="https://metacpan.org/author/DMOL"><img src="https://www.gravatar.com/avatar/78b28a931707c0fa696996adc7702db9?d=identicon&amp;s=20" title="DMOL" alt="DMOL"></a>
<a class="display-all" href="https://metacpan.org/author/KEEDI"><img src="https://www.gravatar.com/avatar/95f905a7a4ccc573c711e9d264c0fde8?d=identicon&amp;s=20" title="KEEDI" alt="KEEDI"></a>
</div>
<!-- Display counts of plussers-->
<div>
    <a href="https://metacpan.org/dist/File-ReadBackwards/plussers">5 PAUSE users</a>
</div>
<div>
    2 non-PAUSE users
</div>
</div>
    </li>
    <li>
    </li>
              </ul>
            </div>
          </nav>
          <div class="content-navigation">
<div class="breadcrumbs">
  <span>
    <a data-keyboard-shortcut="g a" rel="author" href="https://metacpan.org/author/PLICEASE" class="author-name">Graham Ollis 🇺🇦🌻</a>
  </span>
  <span>&nbsp;/&nbsp;</span>
  <div class="release dist-release status-latest maturity-released">
    <span class="dropdown"><b class="caret"></b></span>
<select onchange="document.location.href=&#39;/release/&#39;+this.value+&#39;/view/ReadBackwards.pm&#39;" class="">
<option
  selected
  value="PLICEASE/File-ReadBackwards-1.06"
>1.06
  (PLICEASE on 2021-04-23)</option>
<option
  
  value="URI/File-ReadBackwards-1.05"
>1.05
  (URI on 2011-06-07)</option>
<option
  
  value="URI/File-ReadBackwards-1.04"
>1.04
  (URI on 2005-05-14)</option>
<optgroup label="BackPAN">'
<option
  
  value="URI/File-ReadBackwards-1.03"
>1.03
  (URI on 2005-01-30)</option>
<option
  
  value="URI/File-ReadBackwards-1.02"
>1.02
  (URI on 2003-11-24)</option>
<option
  
  value="URI/File-ReadBackwards-1.00"
>1.00
  (URI on 2003-08-18)</option>
<option
  
  value="URI/File-ReadBackwards-0.99"
>0.99
  (URI on 2002-12-03)</option>
<option
  
  value="URI/File-ReadBackwards-0.98"
>0.98
  (URI on 2002-08-22)</option>
<option
  
  value="URI/File-ReadBackwards-0.97"
>0.97
  (URI on 2002-05-27)</option>
<option
  
  value="URI/File-ReadBackwards-0.96"
>0.96
  (URI on 2002-05-26)</option>
<option
  
  value="URI/File-ReadBackwards-0.95"
>0.95
  (URI on 2002-05-06)</option>
<option
  
  value="URI/File-ReadBackwards-0.94"
>0.94
  (URI on 2000-03-08)</option>
<option
  
  value="URI/File-ReadBackwards-0.92"
>0.92
  (URI on 2000-03-06)</option>
<option
  
  value="URI/File-ReadBackwards-0.90"
>0.90
  (URI on 2000-02-29)</option>
</optgroup>
</select>
    <a data-keyboard-shortcut="g d" class="release-name" href="https://metacpan.org/dist/File-ReadBackwards">File-ReadBackwards-1.06</a>
  </div>
<span class="river-gauge-gauge">
  <svg width="24px"
       height="15px"
       version="1.1"
       xmlns="http://www.w3.org/2000/svg"
       xmlns:xlink="http://www.w3.org/1999/xlink">

    <g>
      <title>        River stage two &#10;
          • 18 direct dependents &#10;          • 35 total dependents
      </title>

      <rect x="0"  y="0" width="4" height="15" fill="#7ea3f2" />
      <rect x="5"  y="0" width="4" height="15" fill="#7ea3f2" />
      <rect x="10"  y="0" width="4" height="15" fill="#e4e2e2" />
      <rect x="15"  y="0" width="4" height="15" fill="#e4e2e2" />
      <rect x="20"  y="0" width="4" height="15" fill="#e4e2e2" />
    </g>
  </svg>

</span>
<div id="File-ReadBackwards-fav" class="logged_in">
<form action="https://metacpan.org/account/favorite/add" style="display: inline" onsubmit="return favDistribution(this)">
    <input type="hidden" name="remove" value="0">
    <input type="hidden" name="release" value="File-ReadBackwards-1.06">
    <input type="hidden" name="author" value="PLICEASE">
    <input type="hidden" name="distribution" value="File-ReadBackwards">
    <button type="submit" class="favorite highlight"><span>7</span> ++</button>
</form>
</div>
<div class="logged_out">
<a href="./File::ReadBackwards.html" onclick="alert('Please sign in to add favorites'); return false" class="favorite highlight">
<span>7</span> ++</a>
</div>
   / <span>File::ReadBackwards</span>
</div>
          </div>
          <main class="content">


<nav class="toc">
  <div class="toc-header"><strong>Contents</strong></div>
<ul>
  <li><a href="./File::ReadBackwards.html#NAME">NAME</a></li>
  <li><a href="./File::ReadBackwards.html#SYNOPSIS">SYNOPSIS</a></li>
  <li><a href="./File::ReadBackwards.html#DESCRIPTION">DESCRIPTION</a></li>
  <li><a href="./File::ReadBackwards.html#OBJECT-INTERFACE">OBJECT INTERFACE</a>
    <ul>
      <li><a href="./File::ReadBackwards.html#new(-$file,-%5B$rec_sep%5D,-%5B$sep_is_regex%5D-)">new( $file, [$rec_sep], [$sep_is_regex] )</a></li>
      <li><a href="./File::ReadBackwards.html#readline">readline</a></li>
      <li><a href="./File::ReadBackwards.html#getline">getline</a></li>
      <li><a href="./File::ReadBackwards.html#eof">eof</a></li>
      <li><a href="./File::ReadBackwards.html#close">close</a></li>
      <li><a href="./File::ReadBackwards.html#tell">tell</a></li>
      <li><a href="./File::ReadBackwards.html#get_handle">get_handle</a></li>
    </ul>
  </li>
  <li><a href="./File::ReadBackwards.html#TIED-HANDLE-INTERFACE">TIED HANDLE INTERFACE</a>
    <ul>
      <li><a href="./File::ReadBackwards.html#tie(-*HANDLE,-&#39;File::ReadBackwards&#39;,-$file,-%5B$rec_sep%5D,-%5B$sep_is_regex%5D-)">tie( *HANDLE, &#39;File::ReadBackwards&#39;, $file, [$rec_sep], [$sep_is_regex] )</a></li>
    </ul>
  </li>
  <li><a href="./File::ReadBackwards.html#LINE-AND-RECORD-ENDINGS">LINE AND RECORD ENDINGS</a></li>
  <li><a href="./File::ReadBackwards.html#DESIGN">DESIGN</a></li>
  <li><a href="./File::ReadBackwards.html#NOTES">NOTES</a></li>
  <li><a href="./File::ReadBackwards.html#AUTHOR">AUTHOR</a></li>
  <li><a href="./File::ReadBackwards.html#COPYRIGHT">COPYRIGHT</a></li>
</ul></nav>
<div class="pod anchors">
<h1 id="NAME">NAME</h1>

<p>File::ReadBackwards.pm -- Read a file backwards by lines.</p>

<h1 id="SYNOPSIS">SYNOPSIS</h1>

<pre><code>    use File::ReadBackwards ;

    # Object interface

    $bw = File::ReadBackwards-&gt;new( &#39;log_file&#39; ) or
                        die &quot;can&#39;t read &#39;log_file&#39; $!&quot; ;

    while( defined( $log_line = $bw-&gt;readline ) ) {
            print $log_line ;
    }

    # ... or the alternative way of reading

    until ( $bw-&gt;eof ) {
            print $bw-&gt;readline ;
    }

    # Tied Handle Interface

    tie *BW, &#39;File::ReadBackwards&#39;, &#39;log_file&#39; or
                        die &quot;can&#39;t read &#39;log_file&#39; $!&quot; ;

    while( &lt;BW&gt; ) {
            print ;
    }</code></pre>

<h1 id="DESCRIPTION">DESCRIPTION</h1>

<p>This module reads a file backwards line by line. It is simple to use, memory efficient and fast. It supports both an object and a tied handle interface.</p>

<p>It is intended for processing log and other similar text files which typically have their newest entries appended to them. By default files are assumed to be plain text and have a line ending appropriate to the OS. But you can set the input record separator string on a per file basis.</p>

<h1 id="OBJECT-INTERFACE"><a id="OBJECT"></a>OBJECT INTERFACE</h1>

<p>These are the methods in <code>File::ReadBackwards</code>&#39; object interface:</p>

<h2 id="new(-$file,-[$rec_sep],-[$sep_is_regex]-)"><a id="new"></a><a id="new---file---rec_sep---sep_is_regex"></a>new( $file, [$rec_sep], [$sep_is_regex] )</h2>

<p><code>new</code> takes as arguments a filename, an optional record separator and an optional flag that marks the record separator as a regular expression. It either returns the object on a successful open or undef upon failure. $! is set to the error code if any.</p>

<h2 id="readline">readline</h2>

<p><code>readline</code> takes no arguments and it returns the previous line in the file or undef when there are no more lines in the file. If the file is a non-seekable file (e.g. a pipe), then undef is returned.</p>

<h2 id="getline">getline</h2>

<p><code>getline</code> is an alias for the readline method. It is here for compatibility with the IO::* classes which has a getline method.</p>

<h2 id="eof">eof</h2>

<p><code>eof</code> takes no arguments and it returns true when readline() has iterated through the whole file.</p>

<h2 id="close">close</h2>

<p><code>close</code> takes no arguments and it closes the handle</p>

<h2 id="tell">tell</h2>

<p><code>tell</code> takes no arguments and it returns the current filehandle position. This value may be used to seek() back to this position using a normal file handle.</p>

<h2 id="get_handle">get_handle</h2>

<p><code>get_handle</code> takes no arguments and it returns the internal Perl filehandle used by the File::ReadBackwards object. This handle may be used to read the file forward. Its seek position will be set to the position that is returned by the tell() method. Note that interleaving forward and reverse reads may produce unpredictable results. The only use supported at present is to read a file backward to a certain point, then use &#39;handle&#39; to extract the handle, and read forward from that point.</p>

<h1 id="TIED-HANDLE-INTERFACE"><a id="TIED"></a>TIED HANDLE INTERFACE</h1>

<h2 id="tie(-*HANDLE,-&#39;File::ReadBackwards&#39;,-$file,-[$rec_sep],-[$sep_is_regex]-)"><a id="tie"></a><a id="tie---HANDLE---File::ReadBackwards---file---rec_sep---sep_is_regex"></a>tie( *HANDLE, &#39;File::ReadBackwards&#39;, $file, [$rec_sep], [$sep_is_regex] )</h2>

<p>The TIEHANDLE, READLINE, EOF, CLOSE and TELL methods are aliased to the new, readline, eof, close and tell methods respectively so refer to them for their arguments and API. Once you have tied a handle to File::ReadBackwards the only I/O operation permissible is &lt;&gt; which will read the previous line. You can call eof() and close() on the tied handle as well. All other tied handle operations will generate an unknown method error. Do not seek, write or perform any other unsupported operations on the tied handle.</p>

<h1 id="LINE-AND-RECORD-ENDINGS"><a id="LINE"></a>LINE AND RECORD ENDINGS</h1>

<p>Since this module needs to use low level I/O for efficiency, it can&#39;t portably seek and do block I/O without managing line ending conversions. This module supports the default record separators of normal line ending strings used by the OS. You can also set the separator on a per file basis.</p>

<p>The record separator is a regular expression by default, which differs from the behavior of $/.</p>

<p>Only if the record separator is <b>not</b> specified and it defaults to CR/LF (e.g, VMS, redmondware) will it will be converted to a single newline. Unix and MacOS files systems use only a single character for line endings and the lines are left unchanged. This means that for native text files, you should be able to process their lines backwards without any problems with line endings. If you specify a record separator, no conversions will be done and you will get the records as if you read them in binary mode.</p>

<h1 id="DESIGN">DESIGN</h1>

<p>It works by reading a large (8kb) block of data from the end of the file. It then splits them on the record separator and stores a list of records in the object. Each call to readline returns the top record of the list and if the list is empty it refills it by reading the previous block from the file and splitting it. When the beginning of the file is reached and there are no more lines, undef is returned. All boundary conditions are handled correctly i.e. if there is a trailing partial line (no newline) it will be the first line returned and lines larger than the read buffer size are handled properly.</p>

<h1 id="NOTES">NOTES</h1>

<p>There is no support for list context in either the object or tied interfaces. If you want to slurp all of the lines into an array in backwards order (and you don&#39;t care about memory usage) just do:</p>

<pre><code>        @back_lines = reverse &lt;FH&gt;.</code></pre>

<p>This module is only intended to read one line at a time from the end of a file to the beginning.</p>

<h1 id="AUTHOR">AUTHOR</h1>

<p>Original author: Uri Guttman, <code>uri@stemsystems.com</code></p>

<p>Current maintainer: Graham Ollis <code>plicease@cpan.org</code></p>

<h1 id="COPYRIGHT">COPYRIGHT</h1>

<p>Copyright (C) 2000-2021 by Uri Guttman. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.</p></div>

<div id="metacpan_install-instructions-dialog" class="modal fade">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
        <h4 class="modal-title">Module Install Instructions</h4>
      </div>
      <div class="modal-body">
        <p>To install File::ReadBackwards, copy and paste the appropriate command in to your terminal.</p>
        <p><a href="https://metacpan.org/dist/App-cpanminus/view/bin/cpanm">cpanm</a></p>
        <pre><code>cpanm File::ReadBackwards</code></pre>
        <p><a href="https://metacpan.org/pod/CPAN">CPAN shell</a></p>
        <pre><code>perl -MCPAN -e shell
install File::ReadBackwards</code></pre>
        <p>For more information on module installation, please visit <a href="https://www.cpan.org/modules/INSTALL.html">the detailed CPAN module installation guide</a>.</p>
      </div>
      <div class="modal-footer">
        <a href="./File::ReadBackwards.html#" data-dismiss="modal" class="btn">Close</a>
      </div>
    </div>
  </div>
</div>
          </main>
          <div class="content-pagination">
          </div>
        </div>
        <footer class="footer">
          <div class="footer-container">
            <div class="footer-social">
              <div class="footer-link footer-logo">
                <a href="https://metacpan.org/">
                  <img src="https://metacpan.org/static/images/metacpan-logo.svg" alt="MetaCPAN" />
                </a>
              </div>
              <a class="footer-social-link" href="https://github.com/metacpan">
                <i class="fab fa-github-square"></i>
              </a>
              <a class="footer-social-link" href="https://fosstodon.org/@metacpan">
                <i class="fab fa-mastodon"></i>
              </a>
            </div>
            <div class="footer-links">
              <div class="footer-link">
                  <a href="https://metacpan.org/about">About</a>
              </div>
              <div class="footer-link">
                  <a href="https://metacpan.org/about/sponsors">Sponsor</a>
              </div>
              <div class="footer-link">
                  <a href="https://grep.metacpan.org">grep::cpan</a>
              </div>
              <div class="footer-link">
                  <a href="https://metacpan.org/recent">Recent</a>
              </div>
              <div class="footer-link">
                  <a href="https://metacpan.org/about/faq">FAQ</a>
              </div>
              <div class="footer-link">
                  <a href="https://metacpan.org/tools">Tools</a>
              </div>
              <div class="footer-link">
                  <a href="https://fastapi.metacpan.org/">API</a>
              </div>
              <div class="footer-link">
                  <a href="https://www.perl.org/">Perl.org</a>
              </div>
            </div>
            <div class="footer-sponsors">
              <a class="footer-sponsor-link" target="_blank" href="https://www.bytemark.co.uk/" rel="noopener">
                <img class="footer-sponsor-bytemark" src="https://metacpan.org/static/images/sponsors/bytemark_logo.svg" alt="Bytemark logo">
              </a>
              <a class="footer-sponsor-link" target="_blank" href="https://www.liquidweb.com/" rel="noopener">
                <img class="footer-sponsor-liquidweb" src="https://metacpan.org/static/images/sponsors/liquidweb_logo.png" alt="liquidweb logo">
              </a>
              <a class="footer-sponsor-link" target="_blank" href="https://deriv.com/careers/" rel="noopener">
                <img class="footer-sponsor-deriv" src="https://metacpan.org/static/images/sponsors/deriv.svg" alt="Deriv logo">
              </a>
              <a class="footer-sponsor-link" target="_blank" href="https://geocode.xyz" rel="noopener">
                <img class="footer-sponsor-geocode" src="https://metacpan.org/static/images/sponsors/geocodelogo.svg" alt="Geocode logo">
              </a>
              <a class="footer-sponsor-link" target="_blank" href="https://www.fastly.com/" rel="noopener">
                <img class="footer-sponsor-fastly" src="https://metacpan.org/static/images/sponsors/fastly_logo.svg" alt="Fastly logo">
              </a>
              <a class="footer-sponsor-link" target="_blank" href="https://opencagedata.com" rel="noopener">
                <img class="footer-sponsor-opencage" src="https://metacpan.org/static/images/sponsors/open-cage.svg" alt="OpenCage logo">
              </a>
            </div>
          </div>
        </footer>
        <div class="modal fade" tabindex="-1" role="dialog" id="metacpan_keyboard-shortcuts">
          <div class="modal-dialog">
            <div class="modal-content">
              <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal">&times;</button>
                <h4 class="modal-title">Keyboard Shortcuts</h4>
              </div>
              <div class="modal-body row">
<div class="col-md-6">
  <table class="table keyboard-shortcuts">
    <thead>
      <tr>
        <th></th>
        <th>Global</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td class="keys">
          <kbd>s</kbd>
        </td>
        <td>Focus search bar</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>?</kbd>
        </td>
        <td>Bring up this help dialog</td>
      </tr>
    </tbody>
  </table>

  <table class="table keyboard-shortcuts">
    <thead>
      <tr>
        <th></th>
        <th>GitHub</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>p</kbd>
        </td>
        <td>Go to pull requests</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>i</kbd>
        </td>
        <td>go to github issues (only if github is preferred repository)</td>
      </tr>
    </tbody>
  </table>
</div>

<div class="col-md-6">
  <table class="table keyboard-shortcuts">
    <thead>
      <tr>
        <th></th>
        <th>POD</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>a</kbd>
        </td>
        <td>Go to author</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>c</kbd>
        </td>
        <td>Go to changes</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>i</kbd>
        </td>
        <td>Go to issues</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>d</kbd>
        </td>
        <td>Go to dist</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>r</kbd>
        </td>
        <td>Go to repository/SCM</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>s</kbd>
        </td>
        <td>Go to source</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>b</kbd>
        </td>
        <td>Go to file browse</td>
      </tr>

    </tbody>
  </table>
</div>

<div class="col-md-12">
  <table class="table keyboard-shortcuts">
    <thead>
      <tr>
        <th></th>
        <th>Search terms</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td><em>module:</em> (e.g. <a href="https://metacpan.org/search?q=module%3APlugin">module:Plugin</a>)</td>
      </tr>
      <tr>
        <td><em>distribution:</em> (e.g. <a href="https://metacpan.org/search?q=distribution%3ADancer+auth">distribution:Dancer auth</a>)</td>
      </tr>
      <tr>
        <td><em>author:</em> (e.g. <a href="https://metacpan.org/search?q=author%3ASONGMU+Redis">author:SONGMU Redis</a>)</td>
      </tr>
      <tr>
        <td><em>version:</em> (e.g. <a href="https://metacpan.org/search?q=version%3A1.00">version:1.00</a>)</td>
      </tr>
    </tbody>
  </table>
</div>
              </div>
              <div class="modal-footer"></div>
            </div>
          </div>
        </div>
    </body>
</html>
